
// 1. boolean
let b1:boolean = true;
b1 = false;
// b1 = 123; // 报错：不能将类型“number”分配给类型“boolean”

// 2. number
let num1:number = 123;
num1 = 1.3;
num1 = -20;
num1 = 0;
num1 = NaN;
// num1 = 'abc'; // 报错： 不能将类型“string”分配给类型“number”

// 3. string
let str:string = 'abc';
str = 'zyx'
// str = 123; // 报错：不能将类型“number”分配给类型“string”。

// 4. object 引用类型   【了解】
let obj1:object = {name:'atguigu', age:20};
obj1 = [1,2,3];
obj1 = function(){
    console.log(123);
}

// 5. 数组：
let arr:number[] = [1,2,3];// arr是一个元素都是数字的数组
// 泛型方式
let arr2:Array<number> = [20,30,40];

let arr3:string[] = ['1','2','3']
let arr4:Array<string> = ['a','b','c']

// 6. any 任意类型: 能不用就不用
let a:any = 123;
a = 'abc';
a = true;
a = [1,2,3];

// 7. void: 限制为 undefined, 一般用来限制函数的返回值
function fn(a:number,b:number):void{
    console.log(a,b);
}

// 8. tuple 元组：元组就是一个特殊的数组，长度以及数组每一个元素的类型已经确定了
let t1:[number, string] = [10,'jame'];

// 9. 枚举 enum

let sex = 1; // sex 0  sex 2 
             // man  woman  secret
             // male female

if(sex === 1){

}else{

}
// 以下代码， left 表示右， right 表示左
// let v1   ...   v12


enum gender {
    man,
    woman=100,
    secret
}

if(sex === gender.woman){

}
console.log(gender);

// 联合类型
let x:number|string = 123;
x = 'abc';

function getX(x:number|string){
    console.log(x.toString());// 联合类型必须使用都有的属性，才不会报错
    // 使用一个有，其他没有的会报错，怎么解决呢？ 使用类型断言

    if((x as string).length){ // 说明是字符串

    }else{// 说明是数字

    }
}
// x = true; // 报错： 不能将类型“boolean”分配给类型“string | number”


// 类型断言：
let oDiv = document.querySelector('#root') as HTMLElement

// const root = ReactDOM.createRoot(document.querySelector('#root') as HTMLElement)

// 类型推断: 如果不指定类型，那么首次赋值的类型就是该变量的类型
let num99 = 123;
// num99 = 'abc';// 报错：不能将类型“string”分配给类型“number”

export {}